package ar.edu.utn.frba.dds.tp.segundaEntrega.code;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import org.joda.time.LocalDate;
import org.joda.time.LocalTime;

public class Usuario {
	
	private String tipo;
	private BigDecimal recargo;
	private List<Busqueda> BusquedasRealizadas; /* de que tipo deberian ser los objetos de esta lista?*/
	
	public String getTipo() {
		return tipo;
	}
	
	public void setTipo(String tipo) {
		this.tipo = tipo;
		if(tipo == "noPaga") {
			this.recargo = new BigDecimal(20);
		}
		else {
			this.recargo = new BigDecimal(0);
		}
	}
	
	public BigDecimal getRecargo() {
		return recargo;
	}
	
	public List<Busqueda> getBusquedasRealizadas() {
		return BusquedasRealizadas;
	}
	
	public void setBusquedasRealizadas(List<Busqueda> busquedas) {
		BusquedasRealizadas = busquedas;
	}
	
	public Usuario(String tipo) {
		this.setTipo(tipo);
		List<Busqueda> busquedas = new ArrayList<Busqueda>();
		this.setBusquedasRealizadas(busquedas);
	}
	
	private List<Vuelo> buscarVuelosSinFiltrar(String origen, String destino,
		LocalDate fechaSalida, LocalTime horaSalida,
		LocalDate fechaLlegada, LocalTime horaLlegada) {
		Busqueda busqueda = new Busqueda(origen, destino, fechaSalida, horaSalida, fechaLlegada, horaLlegada);
		List<Vuelo> vuelosDisponibles = busqueda.getVuelos();
		
		if (!(this.tipo.equals("VIP"))) vuelosDisponibles = sacarSuperOfertas(vuelosDisponibles);
		
		this.getBusquedasRealizadas().add(busqueda);
		return vuelosDisponibles;
	}
	


private List<Vuelo> sacarSuperOfertas(List<Vuelo> vuelosDisponibles) {
		
		for (Vuelo vuelo : vuelosDisponibles) vuelo.filtrarAsientosSuperOferta();
		
		return vuelosDisponibles;
	}
	
	public List<Vuelo> buscarVuelos(String origen, String destino, LocalDate fechaSalida, LocalTime horaSalida, LocalDate fechaLlegada, LocalTime horaLlegada ) {
		List<Vuelo> vuelosDisponibles = this.buscarVuelosSinFiltrar(origen, destino,
				fechaSalida, horaSalida, fechaLlegada, horaLlegada);
		this.mostrarPecios(vuelosDisponibles);
		return vuelosDisponibles;
	}


	
	public List<Vuelo> buscarVuelos(String origen, String destino, LocalDate fechaSalida, LocalTime horaSalida, LocalDate fechaLlegada, LocalTime horaLlegada, ClaseDeAsiento claseAsiento ) {
		List<Vuelo> vuelosDisponiblesSinFiltrar = this.buscarVuelosSinFiltrar(origen, destino,
				fechaSalida, horaSalida, fechaLlegada, horaLlegada);
		List<Vuelo> vuelosDisponibles = this.filtrarAsientos(claseAsiento, vuelosDisponiblesSinFiltrar);
		this.mostrarPecios(vuelosDisponibles);
		return vuelosDisponibles;
	}
	
	public List<Vuelo> buscarVuelos(String origen, String destino, LocalDate fechaSalida, LocalTime horaSalida, LocalDate fechaLlegada, LocalTime horaLlegada, UbicacionDeAsiento ubicacionAsiento ) {
		List<Vuelo> vuelosDisponiblesSinFiltrar = this.buscarVuelosSinFiltrar(origen, destino,
				fechaSalida, horaSalida, fechaLlegada, horaLlegada);
		List<Vuelo> vuelosDisponibles = this.filtrarAsientos(ubicacionAsiento, vuelosDisponiblesSinFiltrar);
		this.mostrarPecios(vuelosDisponibles);
		return vuelosDisponibles;
	}
	
	public List<Vuelo> buscarVuelos(String origen, String destino, LocalDate fechaSalida, LocalTime horaSalida, LocalDate fechaLlegada, LocalTime horaLlegada, ClaseDeAsiento claseAsiento, UbicacionDeAsiento ubicacionAsiento ) {
		List<Vuelo> vuelosDisponiblesSinFiltrar = this.buscarVuelosSinFiltrar(origen, destino,
				fechaSalida, horaSalida, fechaLlegada, horaLlegada);
		List<Vuelo> vuelosFiltradosPorUbicacion = this.filtrarAsientos(ubicacionAsiento, vuelosDisponiblesSinFiltrar);
		List<Vuelo> vuelosDisponibles = this.filtrarAsientos(claseAsiento, vuelosFiltradosPorUbicacion);
		this.mostrarPecios(vuelosDisponibles);
		return vuelosDisponibles;
	}
	
	public void comprarAsiento(AsientoDeVuelo asiento) {
		Vuelo vuelo_a_comprar = asiento.getVuelo();
		Aerolinea aerolinea_del_vuelo = vuelo_a_comprar.getAerolinea();
		aerolinea_del_vuelo.comprarAsiento(asiento);
	} 

	public List<Vuelo> filtrarAsientos(UbicacionDeAsiento ubicacionDeAsiento, List<Vuelo> vuelos) {
		List<Vuelo> vuelosFiltrados = new ArrayList<Vuelo>();
		for(Vuelo vuelo : vuelos) {
			vuelosFiltrados.add(vuelo.filtrarAsientoPorUbicacion(ubicacionDeAsiento.getUbicacion()));
		}
		return vuelosFiltrados;
	}

	public List<Vuelo> filtrarAsientos(ClaseDeAsiento claseDeAsiento, List<Vuelo> vuelos) {
		List<Vuelo> vuelosFiltrados = new ArrayList<Vuelo>();
		for(Vuelo vuelo : vuelos) {
			vuelosFiltrados.add(vuelo.filtrarAsientoPorClase(claseDeAsiento.getClase()));
		}
		return vuelosFiltrados;		
	}
	
	public BigDecimal getPrecioAsiento(AsientoDeVuelo asiento) {
		return asiento.getVuelo().getPrecioAsiento(asiento).add(this.getRecargo());
	}
	
	public void mostrarPecios(List<Vuelo> vuelos) {
		System.out.print("Vuelos disponibles:");
		for(Vuelo vuelo : vuelos) {
			System.out.println(" Numero de vuelo: "+vuelo.getNroDeVuelo());
			vuelo.mostrarPreciosAsientos(this);
		}
	}
	
}
